home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok32.lha / RingBuffers / MultitaskDemo.mod < prev    next >
Text File  |  1993-08-15  |  6KB  |  186 lines

  1. (**********************************************************************
  2.  
  3.     :Program.    MultitaskDemo.mod
  4.     :Contents.   Zeigt die Häufigkeit von einzelnen Zeichen einer Datei an
  5.     :Remark.     benutzt im Gegensatz zu SyncDemo parallele Tasks
  6.     :Author.     Nicolas Benezan [bne]
  7.     :Address.    Postwiesenstr. 2, D7000 Stuttgart 60
  8.     :Phone.      711/333679
  9.     :Copyright.  Public Domain
  10.     :Language.   Modula-2
  11.     :Translator. M2Amiga A+L V3.27d
  12.     :Imports.    BackDrop [Bernd Preusing], TaskSupport, TaskMemory [bne]
  13.     :History.    V1.0 [bne] 12.Jan.1990
  14.  
  15. **********************************************************************)
  16.  
  17. MODULE MultitaskDemo;
  18.  
  19. FROM Arguments   IMPORT GetArg, NumArgs;
  20. FROM Arts        IMPORT Assert, TermProcedure;
  21. FROM BackDrop    IMPORT BdRp, OpenBackDrop;
  22. FROM Dos         IMPORT Close, Delay, Examine, FileHandlePtr,
  23.                         FileInfoBlock, FileInfoBlockPtr, FileLockPtr, Lock,
  24.                         oldFile, Open, Read, sharedLock, UnLock;
  25. FROM Exec        IMPORT AllocSignal, FindTask, FreeSignal, Signal, TaskPtr,
  26.                         Wait;
  27. FROM Graphics    IMPORT SetAPen, WritePixel;
  28. FROM RingBuffers IMPORT CreateRingBuffer, DiscardRingBuffer, GetEmptyBlock,
  29.                         GetFullBlock, PutEmptyBlock, PutFullBlock,
  30.                         RingBuffer, RingBufferBlock;
  31. FROM TaskMemory  IMPORT Allocate, Deallocate;
  32. FROM TaskSupport IMPORT CreateTask, DeleteTask;
  33. FROM SYSTEM      IMPORT ADDRESS, ADR, LONGSET;
  34.  
  35. TYPE
  36.   BufferPtr = POINTER TO Buffer;
  37.   Buffer = RECORD
  38.     size: LONGINT;
  39.     data: ARRAY [0..255] OF CHAR;
  40.   END;
  41.  
  42. CONST
  43.   BufferSize = SIZE (Buffer);
  44.   NumBuffers = 8;
  45.   Usage = 'Usage = "MultitaskDemo" FileName.';
  46.  
  47. VAR
  48.   Count: ARRAY CHAR OF LONGINT;
  49.   File: FileHandlePtr;
  50.   FileName: ARRAY [0..31] OF CHAR;
  51.   TotalSize, Position: LONGINT;
  52.   Len: INTEGER;
  53.   DataBuffer: RingBuffer;
  54.   MainTask, ReadTask: TaskPtr;
  55.   FullSignal, EmptySignal, ReadySignal, StartSignal: INTEGER;
  56.   DummySet: LONGSET;
  57.   ReadCompleted: BOOLEAN;
  58.  
  59. PROCEDURE Cleanup;
  60.   BEGIN
  61.     IF File # NIL THEN
  62.       Close (File);
  63.       File:= NIL;
  64.     END;
  65.     IF ReadySignal >= 0 THEN
  66.       FreeSignal (ReadySignal);
  67.     END;
  68.     IF FullSignal >= 0 THEN
  69.       FreeSignal (FullSignal);
  70.     END;
  71.   END Cleanup;
  72.  
  73. PROCEDURE Draw (DataPtr: BufferPtr);
  74.   VAR
  75.     i: INTEGER;
  76.     Char: CHAR;
  77.     Dummy: LONGINT;
  78.   BEGIN
  79.     FOR i:= 0 TO DataPtr^.size - 1 DO
  80.       Char:= DataPtr^.data[i];
  81.       INC (Position);
  82.       SetAPen (BdRp, 3);
  83.       Dummy:= WritePixel (BdRp, Position * 640 DIV TotalSize, 0);
  84.       INC (Count[Char]);
  85.       SetAPen (BdRp, 2);
  86.       Dummy:= WritePixel (BdRp, Count[Char], ORD (Char) + 1);
  87.       SetAPen (BdRp, 1);
  88.       Dummy:= WritePixel (BdRp, Count[Char] * 640 DIV TotalSize,
  89.                           ORD (Char) + 1);
  90.     END;
  91.   END Draw;
  92.  
  93. PROCEDURE FileSize (Name: ARRAY OF CHAR): LONGINT;
  94.   VAR
  95.     FileLock: FileLockPtr;
  96.     Info: FileInfoBlockPtr;
  97.     Size: LONGINT;
  98.   BEGIN
  99.     Allocate (Info, SIZE (FileInfoBlock));
  100.     Assert (Info # NIL, ADR ("No free store"));
  101.     FileLock:= Lock (ADR (Name), sharedLock);
  102.     Assert (FileLock # NIL, ADR ("Lock() failed"));
  103.     Assert (Examine (FileLock, Info), ADR ("Examine() failed"));
  104.     Size:= Info^.size;
  105.     Deallocate (Info);
  106.     UnLock (FileLock);
  107.     RETURN Size;
  108.   END FileSize;
  109.  
  110. PROCEDURE ReadProcess (MainTaskPtr: ADDRESS);
  111.   VAR
  112.     Block: RingBufferBlock;
  113.     DataPtr: BufferPtr;
  114.     CurrentSize: LONGINT;
  115.   CONST
  116.     DataSize = SIZE (DataPtr^.data);
  117.   BEGIN
  118.     EmptySignal:= AllocSignal (-1); (* cannot fail, new task *)
  119.     StartSignal:= AllocSignal (-1);
  120.     Signal (MainTaskPtr, LONGSET{ReadySignal});
  121.     DummySet:= Wait (LONGSET{StartSignal});
  122.     REPEAT
  123.       WHILE NOT GetEmptyBlock (DataBuffer, Block, DataPtr) DO
  124.         DummySet:= Wait (LONGSET{EmptySignal});
  125.       END;
  126.       CurrentSize:= Read (File, ADR (DataPtr^.data), DataSize);
  127.       DataPtr^.size:= CurrentSize;
  128.       IF CurrentSize > 0 THEN
  129.         PutFullBlock (DataBuffer, Block);
  130.       END;
  131.     UNTIL CurrentSize < DataSize;
  132.     ReadCompleted:= TRUE;
  133.     Signal (MainTaskPtr, LONGSET{FullSignal}); (* prevent deadlock *)
  134.     FreeSignal (EmptySignal);
  135.   END ReadProcess;
  136.  
  137. PROCEDURE MainProcess;
  138.   VAR
  139.     Block: RingBufferBlock;
  140.     DataPtr: BufferPtr;
  141.   BEGIN
  142.     LOOP
  143.       WHILE NOT GetFullBlock (DataBuffer, Block, DataPtr) DO
  144.         IF ReadCompleted THEN (* no more blocks *)
  145.           EXIT
  146.         END;
  147.         DummySet:= Wait (LONGSET{FullSignal});
  148.       END;
  149.       Draw (DataPtr);
  150.       PutEmptyBlock (DataBuffer, Block);
  151.     END;
  152.   END MainProcess;
  153.  
  154. BEGIN
  155.   File:= NIL;
  156.   ReadySignal:= -1;
  157.   FullSignal:= -1;
  158.   ReadCompleted:= FALSE;
  159.   TermProcedure (Cleanup);
  160.   Assert (NumArgs () = 1, ADR (Usage));
  161.   GetArg (1, FileName, Len);
  162.   File:= Open (ADR (FileName), oldFile);
  163.   Assert (File # NIL, ADR ("File not found"));
  164.   TotalSize:= FileSize (FileName);
  165.   OpenBackDrop (2, 640, 257, ADR ("MultitaskDemo"));
  166.   Position:= 0;
  167.   ReadySignal:= AllocSignal (-1);
  168.   Assert (ReadySignal >= 0, ADR ("No signal free"));
  169.   FullSignal:= AllocSignal (-1);
  170.   Assert (FullSignal >= 0, ADR ("No signal free"));
  171.   MainTask:= FindTask (NIL);
  172.   ReadTask:= CreateTask (ReadProcess, MainTask,
  173.                          ADR ("MultitaskDemo.readtask"), 4096, 0);
  174.   IF ReadTask # NIL THEN
  175.     DummySet:= Wait (LONGSET{ReadySignal});
  176.     IF CreateRingBuffer (DataBuffer, BufferSize, NumBuffers, MainTask,
  177.                          FullSignal, ReadTask, EmptySignal) THEN
  178.       Signal (ReadTask, LONGSET{StartSignal});
  179.       MainProcess;
  180.       DiscardRingBuffer (DataBuffer);
  181.     END;
  182.   END;
  183.   Delay (250);
  184. END MultitaskDemo.
  185.  
  186.